home *** CD-ROM | disk | FTP | other *** search
/ ShareWare OnLine 2 / ShareWare OnLine Volume 2 (CMS Software)(1993).iso / database / msgobj10.zip / AREAS.CPP next >
C/C++ Source or Header  |  1993-03-17  |  2KB  |  94 lines

  1. /* areas.c gestione della matrice delle aree in modo virtuale */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <dos.h>
  6. #ifdef __WINDOWS__
  7.   #include <windows.h>
  8. #endif
  9.  
  10. #define AREAS
  11. #include "pipbase.h"
  12. #include "areas.h"
  13. extern NODEINFO cfg;
  14. static AREASTRUCT *ac;
  15. static FILE *fa=NULL;
  16. static int fromarea,toarea;
  17. #ifdef __WINDOWS__
  18.   HANDLE areaSelector;
  19. #endif
  20.  
  21.  
  22. void flush_areas(void)
  23. {
  24.   fseek(fa,fromarea*sizeof(AREASTRUCT),SEEK_SET);
  25.   fwrite(ac,64*sizeof(AREASTRUCT),1,fa);
  26.   changed_areas=0;
  27. }
  28.  
  29.  
  30. void discard_area_changes(void)
  31. {
  32.   changed_areas=0;
  33. }
  34.  
  35.  
  36. void init_areas()
  37. {
  38.   char fn[80];
  39.   int i;
  40.   sprintf(fn,"%sBaseDesc.Pip",cfg.pipdir);
  41. #ifdef __WINDOWS__
  42.   {
  43.     if((areaSelector=GlobalAlloc(GMEM_FIXED,64*sizeof(AREASTRUCT)))==NULL)
  44.       {MessageBox(NULL,"Error in area management\nNo meory","Pip* area manager",MB_OK|MB_ICONHAND); exit(14);} 
  45.     ac=(AREASTRUCT*)GlobalLock(areaSelector);
  46.   }
  47. #else
  48.   if((ac=(AREASTRUCT*)malloc(64*sizeof(AREASTRUCT)))==NULL)
  49.     {fprintf(stderr,"Error in area management (no memory)\7\n"); exit(14);} 
  50. #endif
  51.   if((fa=fopen(fn,"rb+"))==NULL)
  52.     {
  53.       fa=fopen(fn,"wb");
  54.       *ac[0].tag=*ac[0].descr=0;
  55.       for(i=0; i!=cfg.pipsize; i++)
  56.         fwrite(ac,sizeof(AREASTRUCT),1,fa);
  57.       rewind(fa);
  58.     }
  59.   fread(ac,64*sizeof(AREASTRUCT),1,fa);
  60.   fromarea=0; toarea=63;
  61. }
  62.  
  63.  
  64. AREASTRUCT*areas(int area)
  65. {
  66.   if(!fa)
  67.     init_areas();
  68.   if((area>=fromarea) && (area<=toarea))
  69.     return &ac[area-fromarea];
  70.   if(changed_areas) flush_areas();
  71.   fromarea=area/64;
  72.   fromarea*=64;
  73.   toarea=fromarea+63;
  74.   if(fseek(fa,fromarea*sizeof(AREASTRUCT),SEEK_SET))
  75.     {fprintf(stderr,"Error in area management\7\n"); exit(15);}
  76.   if(fread(ac,64*sizeof(AREASTRUCT),1,fa)==0)
  77.     {fprintf(stderr,"Error in reading area datas\7\n"); exit(16);}
  78.   return &ac[area-fromarea];
  79. }
  80.  
  81.  
  82. void close_areas()
  83. {
  84.   if(changed_areas) flush_areas();
  85.   fclose(fa);
  86.   fa=NULL;
  87.   #ifdef __WINDOWS__
  88.     GlobalUnlock(areaSelector);
  89.     GlobalFree(areaSelector);
  90.   #else
  91.     free(ac);
  92.   #endif
  93. }
  94.